package com.happysmile.tsm.annotation.aspect;

import com.happysmile.tsm.annotation.Timer;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

@Component
@Aspect
public class TimerAspect {

/*
    @Before(value = "@annotation(timerAnnotation)")
    public void process(JoinPoint joinPoint, Timer timerAnnotation) {
        long sleepTime = timerAnnotation.heartBeat();
        long untilTime = timerAnnotation.untilTime();
        Object target = joinPoint.getTarget();
        System.out.println(target);
    }
*/

    /*
    * 该切面切入的方法主要适用于周期性的重复执行同样的工作。
    *
    * 主要处理由java控制的线程。
    * 因为通过nohup这样的托管工具有这样一种缺陷，
    * 一旦进程脱离控制，就成了孤儿，而Timer说实在的就是给这些孤儿们一个家。
    * 通过Timer其实就是一个触发器。
    * 通过Timer可以触发好多事儿。
    * */
    @Around(value = "@annotation(timerAnnotation)")
    public void process(ProceedingJoinPoint proceedingJoinPoint, Timer timerAnnotation) {
        long sleepTime = timerAnnotation.heartBeat();
        long durationTime = timerAnnotation.durationTime();

            new Thread() {
                @Override
                public void run() {
                    long currentTime = 0;
                    while (true){
                        try {
                            proceedingJoinPoint.proceed();
                        } catch (Throwable throwable) {
                            throwable.printStackTrace();
                        }
                        try{
                            Thread.sleep(sleepTime);
                            currentTime = currentTime + sleepTime;
                            if (currentTime >= durationTime && durationTime > 0){
                                break;
                            }
                        }catch (Exception e){
                        }
                    }
                }
            }.start();

    }



}
